package work20241223;

/**
 * @author zdl
 * @date 2024/12/24
 */
class Goods {
    private String name;
    private double price;
    private boolean isProduct; //是否需要生产     true 需要生产，false不需要生产


    public Goods() {
    }

    public Goods(String name, double price, boolean isProduct) {
        this.name = name;
        this.price = price;
        this.isProduct = isProduct;
    }

    /**
     * 获取
     *
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     *
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     *
     * @return price
     */
    public double getPrice() {
        return price;
    }

    /**
     * 设置
     *
     * @param price
     */
    public void setPrice(double price) {
        this.price = price;
    }

    /**
     * 获取
     *
     * @return isProduct
     */
    public boolean isIsProduct() {
        return isProduct;
    }

    /**
     * 设置
     *
     * @param isProduct
     */
    public void setIsProduct(boolean isProduct) {
        this.isProduct = isProduct;
    }

    public String toString() {
        return "Goods{name = " + name + ", price = " + price + ", isProduct = " + isProduct + "}";
    }
}

//消费者线程
class Custormer implements Runnable {
    private Goods goods;

    public Custormer(Goods goods) {
        this.goods = goods;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (goods) {
                //判断商品是否有无
                //true 是没有商品 需要生成  false 有商品，不需要生产
                if (goods.isIsProduct()) { //true 没有商品，需要生产
                    try {
                        goods.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                } else {//false 有商品  直接购买
                    System.out.println("消费者购买:" + goods.getName() + "价格:" + goods.getPrice());
                    //购买完后，商品没有了  去修改isProduct  需要唤醒生产者
                    goods.setIsProduct(true);
                    //唤醒生产者
                    goods.notify();
                }
            }
        }
    }
}

//生产者线程
class Productor implements Runnable {
    private Goods goods;

    public Productor(Goods goods) {
        this.goods = goods;
    }

    @Override
    public void run() {
        int count = 0; //计数器
        while (true) {
            synchronized (goods) {//true 是没有商品 需要生成  false 有商品，不需要生产
                // 造烟，奇数造云龙  偶数 造利群
                if (goods.isIsProduct()) {//需要生产
                    if (count % 2 == 0) {
                        goods.setName("利群");
                        goods.setPrice(18);
                    } else {
                        goods.setName("云龙");
                        goods.setPrice(15);
                    }
                    //上面为生产，  上产完后 将isProduct 设置为false  不需要生产
                    goods.setIsProduct(false);
                    System.out.println("生产者生产了:" + goods.getName() + "价格为:" + goods.getPrice());
                    count++;
                    //有产品了，消费者可以消费了  需要唤醒消费者线程
                    goods.notify();
                } else {//不需要生产
                    try {
                        goods.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        }
    }
}

public class Demo7 {
    public static void main(String[] args) {
        Goods goods = new Goods("云龙", 15, false);
        Custormer custormer = new Custormer(goods);
        Productor productor = new Productor(goods);
        new Thread(custormer).start();
        new Thread(productor).start();
    }
}
